package cn.tyz.kotlin.ui

import android.os.Bundle
import android.util.Log
import cn.tyz.kotlin.R

/**
 * @author : tyz
 * @ClassName: Note05Interface
 * @Description:Kotlin学习笔记（五）接口，可见性修饰符
 * @time 2018/5/20 14:55
 *
 *可见性修饰符
    Kotlin中，提供了四种可见性修饰符：public，internal（模块权限），protected，private。
   除了protected修饰符不适用于顶层声明元素外，其它可见性修饰符都可以用来修饰顶层声明元素
    public 声明随处可见   没有显式指定可见性修饰符的情况下可见性默认是public，即K类随处可见
    internal 声明在相同模块内可见  只在本模块(即头部声明的同一个包)内可见
    private 声明在本文件内可见

 */
class Note05Interface : BaseActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.act_common)
        val impA = ImpA()
        impA.fun1()
        impA.fun2()
        var d = D()
        d.f()




    }


    interface Base {
        var arg1: String//抽象属性
        var arg2: String//在接口中声明的属性不能有幕后字段（backing field），因此接口中声明的访问器不能引用它们。
            get() = "arg2"
            set(value) {
                arg2 = value
            }

        fun fun1(): Unit//抽象方法

        fun fun2(): Unit {//方法实现
            Log.i("Base","fun2 in Base")
        }
    }

    //ImpA实现Base接口
    class ImpA : Base {

        //实现Base中的arg1属性
        override var arg1: String
            get() = TODO("not implemented")
            set(value) {}

        //覆盖Base中arg2属性
        override var arg2: String
            get() = super.arg2
            set(value) {}

        //实现Base中的fun1方法
        override fun fun1() {
            fun2()//调用Base中的fun2方法
            Log.i("ImpA",arg2)//打印Base中的arg2属性
        }

        //覆盖Base中的fun2方法实现
        override fun fun2() {
            super.fun2()
        }
    }





    interface E{
        fun f():Unit{
            Log.i("E","f in E")
        }
    }
    interface F{
        fun f():Unit{
            Log.i("E","f in F")
        }
    }
    class D:E,F{
        override fun f() {
            super<E>.f()//调用E中的f方法
            super<F>.f()//调用F中的f方法
        }
    }
}